#pragma once

#include <iostream>
#include <memory>
#include <unordered_map>
#include "Epoller.hpp"
#include "Listener.hpp"
#include "Connection.hpp"

// 后面我们在更改名字
class TcpServer
{
public:
    TcpServer():_epoller_ptr(std::make_unique<Epoller>())
    {}
    void Start()
    {
        while(true)
        {
            _epoller_ptr->Wait();
        }
    }
    // 该接口要把所有的新连接添加到_connections，并且，写透到epoll内核中！！！！！
    void AddConnection(std::shared_ptr<Connection> &conn)
    {
        // 1. conn对应的fd和他要关心的事件，写透到内核中！
        uint32_t events = conn->GetEvent();
        int sockfd = conn->GetFd();
        _epoller_ptr->AddEvent(sockfd, events);

        // 2. 将具体的connection添加到_connections
        _connections[sockfd] = conn;
    }
    ~TcpServer()
    {}
private:
    // 1. epoll模型
    std::unique_ptr<Epoller> _epoller_ptr;
    // 3. 管理所有的connection，本质是管理未来所有我获取到的fd
    // fd : Connection
    std::unordered_map<int, std::shared_ptr<Connection>> _connections;
};